/* queue.h -- Queue的接口 */
#ifndef _QUEUE_H_
#define _QUEUE_H_
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 在这里插入Item类型的定义，例如typedef int Item;
// 用于 use_q.c, 或者
typedef struct item {
    long arrive;    // 一位顾客加入队列的时间
    int processtime;    // 该顾客资讯时花费的时间
} Item;

#define MAXQUEUE 10
typedef struct node {
    Item item;
    struct node *next;
} Node;

typedef struct queue {
    Node *front;    // 指向队列首项的指针
    Node *rear;     // 指向队列尾项的指针
    int items;      // 队列中的项数
} Queue;

/* 操作：       初始化队列
 * 前提条件：   pq指向一个队列
 * 后置条件：   队列被初始化为空 */

void InitializeQueue(Queue *pq);

/* 操作：       检查队列是否已满
 * 前置条件：   pq指向之前被初始化的队列
 * 后置条件：   如果队列已满则返回true，否则返回false */

bool QueueIsFull(const Queue *pq);

/* 操作：       检查队列是否为空
 * 前置条件：   pq指向之前被初始化的队列
 * 后置条件：  如果队列为空则返回ture，否则返回false */

bool QueueIsEmpty(const Queue *pq);

/* 操作：       确定队列中的项数
 * 前置条件：   pq指向之前被初始化的队列
 * 后置条件：   返回队列中的项数 */

int QueueItemCount(const Queue *pq);

/* 操作：       在队列末尾添加项
 * 前置条件：   pq指向之前被初始化的队列
 *              item是要被添加在队列末尾的项
 * 后置条件：   如果队列不为空，item将被添加在队列的末尾，
 *              该函数返回true；否则，队列不改变，该函数
 *              返回false */

bool EnQueue(Item item, Queue *pq);

/* 操作：       在队列的开头删除项
 * 前置条件：   pq指向之前被初始化的队列
 * 后置条件：   如果队列不为空，队列首段的item将被拷贝到
 *              *pitem中并被删除，且函数返回true；如果函
 *              数返回false */

bool DeQueue(Item *pitem, Queue *pq);

/* 操作：       清空队列
 * 前置条件:    pq指向之前被初始化的队列
 * 后置条件：   队列被清空 */

void EmptyTheQueue(Queue *pq);

#endif 



